home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bbmisc.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-12-11  |  15.2 KB  |  567 lines

  1. (*===========================================================================*)
  2. (* Miscellaneous things - 1                                                  *)
  3. (*                                                                           *)
  4. (*   Copyright 1988, 1989, 1990, 1991 by H. Roy Engehausen.  All rights      *)
  5. (*   reserved.                                                               *)
  6. (*                                                                           *)
  7. (*===========================================================================*)
  8.  
  9. {$O+}
  10.  
  11. UNIT BBMISC;
  12.  
  13. INTERFACE
  14.  
  15. USES
  16.   bbdummy;
  17.  
  18.   FUNCTION  check_priv(uc_to_check : user_class_type) : BOOLEAN;
  19.  
  20.   FUNCTION  find_port_addr (look_port_char : CHAR) : port_block_ptr;
  21.  
  22.   FUNCTION  find_port (look_port_char : CHAR) : BOOLEAN;
  23.  
  24.   FUNCTION  compare_call(c1 : bb_addr_str; c2 : bb_addr_str) : BOOLEAN;
  25.  
  26.   FUNCTION  strip_ssid  (c : bb_addr_str) : bb_addr_str;
  27.  
  28.   PROCEDURE process_sid (in_str : str_ptr);
  29.  
  30.   FUNCTION  file_test   (in_file : file_name_str) : INTEGER;
  31.  
  32.   PROCEDURE connect_format(in_str : str_ptr; this_port : port_block_ptr);
  33.  
  34.   PROCEDURE set_dollar1_parm (in_str : str_ptr);
  35.  
  36.   FUNCTION  move_array_to_str(array_ptr    : POINTER;
  37.                               array_length : BYTE) : STRING;
  38.  
  39.   PROCEDURE set_binary_switch(switch_value : BOOLEAN);
  40.  
  41.   PROCEDURE switch_show(b: BOOLEAN);
  42.  
  43.   FUNCTION comment_line(VAR s: STRING) : BOOLEAN;
  44.  
  45. IMPLEMENTATION
  46.  
  47.   USES
  48.     DOS,
  49.     bbmdata,
  50.     bbmem,
  51.     bbmess,
  52.     bbmisc2,
  53.     bbsema2,
  54.     bbstr;
  55.  
  56. (*===========================================================================*)
  57. (* Compare user's privilege against some things                              *)
  58. (*===========================================================================*)
  59.  
  60. FUNCTION check_priv(uc_to_check : user_class_type) : BOOLEAN;
  61.  
  62.   BEGIN;
  63.  
  64.     WITH active_tcb^.uid_data DO
  65.       check_priv := (user_class >= uc_to_check)
  66.                                         OR ((user_flag AND user_f_sysop) <> 0);
  67.  
  68.   END;
  69.  
  70. (*===========================================================================*)
  71. (* Find the port that corresponds to a letter.                               *)
  72. (*===========================================================================*)
  73.  
  74. FUNCTION  find_port_addr (look_port_char : CHAR) : port_block_ptr;
  75.  
  76.   VAR
  77.     look_port : port_block_ptr;
  78.  
  79.   BEGIN;
  80.  
  81.     look_port := ring_port;
  82.  
  83.     REPEAT
  84.  
  85.       IF look_port^.port_char = look_port_char THEN
  86.         BEGIN;
  87.           find_port_addr := look_port;
  88.           EXIT;
  89.         END;
  90.  
  91.       look_port := look_port^.next_port;
  92.  
  93.     UNTIL look_port = ring_port;
  94.  
  95.     find_port_addr := NIL;
  96.  
  97.  
  98.   END;
  99.  
  100.  
  101.  
  102. (*===========================================================================*)
  103. (* Find the port that corresponds to a letter.  Set active port              *)
  104. (*===========================================================================*)
  105.  
  106. FUNCTION find_port (look_port_char : CHAR) : BOOLEAN;
  107.  
  108.   VAR
  109.     look_port : port_block_ptr;
  110.  
  111.   BEGIN;
  112.  
  113.     look_port := find_port_addr(look_port_char);
  114.  
  115.     find_port := look_port <> NIL;
  116.  
  117.     IF look_port <> NIL THEN
  118.       BEGIN;
  119.         active_tcb^.tcb_port := look_port;
  120.         active_port          := look_port;
  121.         find_port := TRUE;
  122.       END
  123.     ELSE
  124.       find_port := FALSE;
  125.  
  126.   END;
  127.  
  128. (*===========================================================================*)
  129. (* Compare two callsigns dropping the ssid                                   *)
  130. (*===========================================================================*)
  131.  
  132. FUNCTION compare_call(c1 : bb_addr_str; c2 : bb_addr_str) : BOOLEAN;
  133.  
  134. {$UNDEF DEBUG_CC}
  135.  
  136.   VAR
  137.     i : BYTE;
  138.     j : BYTE;
  139.  
  140.   BEGIN;
  141.  
  142.     i := LENGTH(c1);
  143.     IF i > LENGTH(c2) THEN
  144.       i := LENGTH(c2);
  145.  
  146. {$IFDEF DEBUG_CC}
  147. WRITELN('I=', i);
  148. {$ENDIF}
  149.  
  150.     compare_call := TRUE;
  151.  
  152.     j := 0;
  153.     WHILE j < i DO
  154.       BEGIN;
  155.         INC(j);
  156.         IF (c1[j] = '-') AND (c2[j] = '-') THEN
  157.           EXIT;
  158.         IF c1[j] <> c2[j] THEN
  159.           BEGIN;
  160.             compare_call := FALSE;
  161.             EXIT;
  162.           END;
  163.       END;
  164.  
  165. {$IFDEF DEBUG_CC}
  166. WRITELN('Out of loop');
  167. {$ENDIF}
  168.  
  169.     IF LENGTH(c1) = LENGTH(c2) THEN
  170.       EXIT;
  171.  
  172. {$IFDEF DEBUG_CC}
  173. WRITELN('Test 1 fail -- ', i, ' -- ', j);
  174. {$ENDIF}
  175.  
  176.     INC(j);
  177.  
  178.     IF (LENGTH(c1) = i) AND (c2[j] = '-') THEN
  179.       EXIT;
  180.  
  181. {$IFDEF DEBUG_CC}
  182. WRITELN('Test 2 failed');
  183. {$ENDIF}
  184.  
  185.     IF c1[j] = '-' THEN
  186.       EXIT;
  187.  
  188. {$IFDEF DEBUG_CC}
  189. WRITELN('Test 3 failed');
  190. {$ENDIF}
  191.  
  192.     compare_call := FALSE;
  193.  
  194.   END;
  195.  
  196. (*===========================================================================*)
  197. (* Strip SSID                                                                *)
  198. (*===========================================================================*)
  199.  
  200. FUNCTION strip_ssid(c : bb_addr_str) : bb_addr_str;
  201.  
  202.   VAR
  203.     i : BYTE;
  204.     j : BYTE;
  205.  
  206.   BEGIN;
  207.  
  208.     i := POS('-', c);
  209.     IF i > 0 THEN DEC(i);
  210.     strip_ssid := substr(c, 1, i);
  211.  
  212.   END;
  213.  
  214. (*===========================================================================*)
  215. (* Handle SID                                                                *)
  216. (*===========================================================================*)
  217.  
  218. PROCEDURE process_sid(in_str : str_ptr);
  219.  
  220.   TYPE
  221.     t = ^BYTE;
  222.  
  223.   VAR
  224.     i : BYTE;
  225.  
  226.   (*=========================================================================*)
  227.   (* Get a level of a certain character                                      *)
  228.   (*=========================================================================*)
  229.  
  230.   PROCEDURE get_level(type_char   : CHAR;
  231.                       byte_to_set : t;
  232.                       max_level   : BYTE);
  233.  
  234.     VAR
  235.       i : BYTE;
  236.  
  237.     BEGIN;
  238.  
  239.       (*---------------------------------------------------------------------*)
  240.       (* See if character exists.  If not, we are done                       *)
  241.       (*---------------------------------------------------------------------*)
  242.  
  243.       i := POS(type_char, in_str^);
  244.  
  245.       IF i = 0 THEN
  246.         BEGIN;
  247.           byte_to_set^ := 0;
  248.           EXIT;
  249.         END;
  250.  
  251.       (*---------------------------------------------------------------------*)
  252.       (* Get the character to test                                           *)
  253.       (*---------------------------------------------------------------------*)
  254.  
  255.       type_char := in_str^[i+1];
  256.  
  257.       (*---------------------------------------------------------------------*)
  258.       (* If non-numeric then this is TYPE=1                                  *)
  259.       (*---------------------------------------------------------------------*)
  260.  
  261.       IF (type_char < '0') OR (type_char > '9') THEN
  262.         BEGIN;
  263.           byte_to_set^ := 1;
  264.           EXIT;
  265.         END;
  266.  
  267.       (*---------------------------------------------------------------------*)
  268.       (* Set level.  There is a MAX                                          *)
  269.       (*---------------------------------------------------------------------*)
  270.  
  271.       i := 1 + ORD(type_char) - ORD('0');
  272.  
  273.       IF i > max_level THEN
  274.         i := max_level;
  275.  
  276.       byte_to_set^ := i;
  277.  
  278.     END; (*----- End of GET_LEVEL subroutine --------------------------------*)
  279.  
  280.   (*=========================================================================*)
  281.   (* Main line of process SID                                                *)
  282.   (*=========================================================================*)
  283.  
  284.   BEGIN;
  285.  
  286.     (*-----------------------------------------------------------------------*)
  287.     (* Handle the sign on for an advanced bbs                                *)
  288.     (*      This is an incoming command for the following format:            *)
  289.     (*          [xxxxxxx-fff]                                                *)
  290.     (*      xxxxxx = the author id and version #                             *)
  291.     (*      fff    = features of this BBS                                    *)
  292.     (*                    $ = BID                                            *)
  293.     (*                    R = Improved BID responses                         *)
  294.     (*                    M = MID                                            *)
  295.     (*                    C = Clock set                                      *)
  296.     (*                    H = Hierarchical address                           *)
  297.     (*-----------------------------------------------------------------------*)
  298.  
  299.     (*-----------------------------------------------------------------------*)
  300.     (* Advanced BBS -- Set proper bits                                       *)
  301.     (*-----------------------------------------------------------------------*)
  302.  
  303.     active_tcb^.tcb_abbs := TRUE;
  304.  
  305.     (*-----------------------------------------------------------------------*)
  306.     (* Strip the author/version info from the string                         *)
  307.     (*-----------------------------------------------------------------------*)
  308.  
  309.     i := POS('-', in_str^);
  310.     WHILE i <> 0 DO
  311.       BEGIN;
  312.         in_str^ := substr(in_str^, i+1, 0);
  313.         i := POS('-', in_str^);
  314.       END;
  315.  
  316.     (*-----------------------------------------------------------------------*)
  317.     (* Set the switches for the features as appropriate                      *)
  318.     (*-----------------------------------------------------------------------*)
  319.  
  320.     IF POS('M', in_str^) <> 0 THEN
  321.       active_tcb^.tcb_mids_ok := TRUE;
  322.  
  323.     IF POS('H', in_str^) <> 0 THEN
  324.       active_tcb^.tcb_h_ok := TRUE;
  325.  
  326.     get_level('R', @i, 2);
  327.  
  328.     IF (i > 0) OR (POS('$', in_str^) <> 0) THEN
  329.       INC(i);
  330.  
  331.     active_tcb^.tcb_bid_level := i;
  332.  
  333.   END;
  334.  
  335. (*===========================================================================*)
  336. (* Test to see if a file exists                                              *)
  337. (*===========================================================================*)
  338.  
  339. FUNCTION  file_test (in_file : file_name_str) : INTEGER;
  340.  
  341.   VAR
  342.     f : FILE;
  343.     i : INTEGER;
  344.  
  345.   BEGIN;
  346.  
  347.     {$I-}
  348.     CLOSE(f);
  349.     i := IORESULT;
  350.     {$I+}
  351.  
  352.     ASSIGN(f, in_file);
  353.  
  354.     {$I-}
  355.     RESET(f);
  356.     i := IORESULT;
  357.     {$I+}
  358.  
  359.     file_test := i;
  360.  
  361.     {$I-}
  362.     CLOSE(f);
  363.     i := IORESULT;
  364.     {$I+}
  365.  
  366.   END;
  367.  
  368. (*===========================================================================*)
  369. (* Either adds or subtracts the VIA and PC*PA port                           *)
  370. (*===========================================================================*)
  371.  
  372. PROCEDURE connect_format(in_str : str_ptr; this_port : port_block_ptr);
  373.  
  374.   VAR
  375.     i : WORD;
  376.     s : STRING[12];
  377.  
  378.   (*=========================================================================*)
  379.   (* Subprogram for VIA                                                      *)
  380.   (*=========================================================================*)
  381.  
  382.   PROCEDURE handle_via;
  383.  
  384.     VAR
  385.       p_type : port_type_type;
  386.  
  387.     BEGIN;
  388.  
  389.       p_type := this_port^.port_type;
  390.  
  391.       s := 'V';
  392.       i := find(in_str, @s);
  393.  
  394.       s := 'VIA';
  395.       IF i = 0 THEN
  396.         i := find(in_str, @s);
  397.  
  398.       IF i = 1 THEN
  399.         i := 0;
  400.  
  401.       IF (i > 0) THEN
  402.         BEGIN;
  403.           IF (p_type = port_g8bpq) OR (p_type = port_aeapk232) THEN
  404.             EXIT;
  405.           in_str^ := subword(in_str, 1, i-1) + ' ' + subword(in_str, i+1, 0);
  406.           EXIT;
  407.         END;
  408.  
  409.       IF (p_type <> port_g8bpq) AND (p_type <> port_aeapk232) THEN
  410.         EXIT;
  411.  
  412.       i := 2;
  413.  
  414.       IF (substr(in_str^, 1, 2) = 'CO') AND
  415.              (in_str^[3] <> ' ') THEN
  416.         i := 1;
  417.  
  418.       IF in_str^[1] <> 'C' THEN
  419.         i := 1;
  420.  
  421.       IF words(in_str^) > i THEN
  422.         in_str^ := subword(in_str, 1, i) + ' VIA ' + subword(in_str, i+1, 0);
  423.  
  424.     END; (*----- End via procedure ------------------------------------------*)
  425.  
  426.   (*=========================================================================*)
  427.   (* Subprogram for PC*PA                                                    *)
  428.   (*=========================================================================*)
  429.  
  430.   PROCEDURE handle_pcpa;
  431.     BEGIN;
  432.  
  433.       IF (LENGTH(in_str^) > 1) AND (in_str^[2] <> ' ') THEN
  434.         in_str^ := in_str^[1] + ' ' + substr(in_str^, 2, 0);
  435.  
  436.       s := subword(in_str, 2, 1);
  437.  
  438.       IF (LENGTH(s) < 2) OR (s[2] <> ':') THEN
  439.         s := '0:' + s;
  440.  
  441.       s[1] := this_port^.port_num;
  442.  
  443.       in_str^ := subword(in_str, 1, 1) + ' ' + s +  ' ' + subword(in_str, 3, 0);
  444.  
  445.     END;
  446.  
  447.   BEGIN;
  448.  
  449.     handle_via;
  450.  
  451.     IF this_port^.port_type = port_pcpa THEN
  452.       handle_pcpa;
  453.  
  454.   END;
  455.  
  456. (*===========================================================================*)
  457. (* Sets error parameter                                                      *)
  458. (*===========================================================================*)
  459.  
  460. PROCEDURE set_dollar1_parm(in_str : str_ptr);
  461.  
  462.   VAR
  463.     here : POINTER;
  464.     i    : WORD;
  465.  
  466.   BEGIN;
  467.  
  468.     free_task_mem('$1', TRUE);
  469.  
  470.     i := LENGTH(in_str^) + 1;
  471.     here := get_task_mem('$1', i);
  472.     MOVE(in_str^, here^, i);
  473.  
  474.   END;
  475.  
  476. (*===========================================================================*)
  477. (* Move character array to string                                            *)
  478. (*===========================================================================*)
  479.  
  480. FUNCTION move_array_to_str(array_ptr    : POINTER;
  481.                            array_length : BYTE) : STRING;
  482.  
  483.   TYPE
  484.     in_array = ARRAY[1..255] OF CHAR;
  485.  
  486.   VAR
  487.     i : WORD;
  488.     o : STRING;
  489.     p : ^in_array;
  490.  
  491.   BEGIN;
  492.  
  493.     i := 1;
  494.     p := array_ptr;
  495.  
  496.     WHILE TRUE DO
  497.       IF (i > array_length) OR (p^[i] = ' ') THEN
  498.         BEGIN;
  499.            DEC(i);
  500.            IF i > 0 THEN
  501.              MOVE(p^, o[1], i);
  502.            o[0] := CHR(i);
  503.            move_array_to_str := o;
  504.            EXIT;
  505.         END
  506.       ELSE
  507.         INC(i);
  508.  
  509.   END;
  510.  
  511. (*===========================================================================*)
  512. (* Set thread's binary switch                                                *)
  513. (*===========================================================================*)
  514.  
  515. PROCEDURE set_binary_switch(switch_value : BOOLEAN);
  516.   VAR
  517.     p : tcb_ptr;
  518.  
  519.   BEGIN;
  520.     active_tcb^.tcb_binary := switch_value;
  521.     p := active_tcb^.conv_tcb;
  522.     IF p <> NIL THEN
  523.       p^.tcb_binary := switch_value;
  524.   END;
  525.  
  526. (*===========================================================================*)
  527. (* Show a switch setting                                                     *)
  528. (*===========================================================================*)
  529.  
  530. PROCEDURE switch_show(b: BOOLEAN);
  531.   BEGIN;
  532.  
  533.     IF b THEN
  534.       send_message(message_sw_on)
  535.     ELSE
  536.       send_message(message_sw_off);
  537.  
  538.   END;
  539.  
  540. (*===========================================================================*)
  541. (* Determine if comments                                                     *)
  542. (*===========================================================================*)
  543.  
  544. FUNCTION comment_line(VAR s: STRING) : BOOLEAN;
  545.  
  546.   VAR
  547.     i : BYTE;
  548.     j : INTEGER;
  549.  
  550.   BEGIN;
  551.  
  552.     i := 1;
  553.     j := LENGTH(s);
  554.  
  555.     WHILE (i <= j) AND (s[i] = ' ') DO
  556.       INC(i);
  557.  
  558.     IF (i > j) OR (s[i] = ';') THEN
  559.       comment_line := TRUE
  560.     ELSE
  561.       comment_line := FALSE;
  562.  
  563.     EXIT;
  564.  
  565.   END;
  566. END.
  567.